﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace MwanaDOC
{
    public partial class cadMat : UserControl
    {
        Materia materia = new Materia();
        Global.Modo _modo;
        string sigla;
        /// <summary>
        /// construtor para atualizar
        /// </summary>
        /// <param name="modo"></param>
        /// <param name="materia"></param>
        public cadMat(Global.Modo modo,Materia materia)
        {
            InitializeComponent();
            _modo = modo;

            if( _modo == Global.Modo.Atualizar)
            {
                   btnGuardar.Text = "Atualizar";
                   txtCodMateria.Text =  materia.IdMateria.ToString();
                   txtMateria.Text =  materia.Nome;
                   txtSigla.Text =  materia.Sigla;
                   txtProfTitular.Text =  materia.Prof_Titular;
                   txtPeriod.Text = materia.Periodo;
                   txtAno.Text =  materia.Ano;
                   cabecalho.Values.Description = "Atualizar";
                   sigla = txtSigla.Text;

            }
        }

        /// <summary>
        /// Para nova matéria
        /// </summary>
        /// <param name="modo"></param>
        public cadMat(Global.Modo modo)
        {
            InitializeComponent();
            _modo = modo;

            if (_modo == Global.Modo.Novo)
            {
                btnGuardar.Text = "Guardar";
                lblObs.Text = "";
            }
        }

       
        /// <summary>
        /// Objeto pra instância do formulário
        /// </summary>
        private static cadMat _frmFilho;
        /// <summary>
        /// retorna uma nova instância do formulário
        /// apenas se não existir nenhum objeto do tipo já instanciado
        /// </summary>
        /// <param name="modo">Modo de abertura <seealso cref="Global.Modo"/></param>
        /// <returns></returns>
        public static cadMat getFrmFilho(Global.Modo modo)
        {
            //if (_frmFilho == null)
            //{
            //    _frmFilho = new cadMat(modo);
            //}
            //else if (_frmFilho != null)
            //{
            //    if (_frmFilho._modo == Global.Modo.Atualizar)
            //    {
            //        //neste caso é necessário cirar nova instância do objeto
            //        _frmFilho = new cadMat(modo);
            //    }
            //}
            _frmFilho = new cadMat(modo);
            return _frmFilho;
        }

        /// <summary>
        /// Fecha a instância do formulário
        /// </summary>
        public static void killFormChild()
        {
            if (_frmFilho != null)
                _frmFilho = null;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            
            if (valida())
            {
                lblResult.ForeColor = System.Drawing.Color.White;
                materia.IdMateria = int.Parse(txtCodMateria.Text);
                materia.Nome = txtMateria.Text;
                materia.Periodo = txtPeriod.Text;
                materia.Prof_Titular = txtProfTitular.Text;
                materia.Sigla = txtSigla.Text;
                materia.Ano = txtAno.Text;

                /*Verificar se o código existe
                 * para garantir que a operação é de atualização ou cadastro de nova disciplina
                 * Se não existir muda o modo para Novo
                 * Se existir muda o modo para Atualizar
                 */
                object codMateria;
                codMateria = materia.VerificaCodigo(materia.IdMateria);
                if ((codMateria == null) || (codMateria == DBNull.Value))
                {
                    _modo = Global.Modo.Novo;
                }
                else
                {
                    _modo = Global.Modo.Atualizar;
                }

                if (_modo == Global.Modo.Novo)
                {
                    if (materia.Save())
                    {
                        string cod;
                        cod = ((int.Parse(txtCodMateria.Text) + 1)).ToString();
                        txtCodMateria.Text = cod;
                        lblResult.ForeColor = System.Drawing.Color.White;
                        lblResult.Text = "Matéria cadastrada com sucesso!";
                    }
                    else
                    {
                        lblResult.ForeColor = System.Drawing.Color.Red;
                        lblResult.Text = "Erro ao cadastrar a matéria!";
                    }
                }
                else if ( _modo == Global.Modo.Atualizar)
                {
                    if (materia.Update(sigla))
                    {
                        //string cod;
                        //cod = ((int.Parse(txtCodMateria.Text) + 1)).ToString();
                        //txtCodMateria.Text = cod;
                        lblResult.ForeColor = System.Drawing.Color.White;
                        lblResult.Text = "Dados alterados com sucesso!";
                    }
                    else
                    {
                        lblResult.ForeColor = System.Drawing.Color.Red;
                        lblResult.Text = "Erro ao atualizar a matéria!";
                    }  
                }
            }

        }

        private bool valida()
        {
            lblResult.ForeColor = System.Drawing.Color.Red;
            bool passed = false;
            if (txtCodMateria.Text.Equals(""))
            {
                passed = false;
                return passed;
                //lblResult.Text = "Digite o ano";
            }
            else
            {
                passed = true; lblResult.Text = "";
            }
            if (txtMateria.Text.Equals(""))
            {
                passed = false;
                lblResult.Text = "Informe o nome da matéria";
                return passed;
                
            }
            else
            {
                passed = true; lblResult.Text = "";
            }
            if (txtProfTitular.Text.Equals(""))
            {
                passed = false;
                lblResult.Text = "Informe o nome do professor";
                return passed;
            }
            else
            {
                passed = true; lblResult.Text = "";
            }
            if (txtSigla.Text.Equals(""))
            {
                txtSigla.Text = txtMateria.Text;
            }
            if (txtPeriod.Text.Equals(""))
            {
                passed = false;
                lblResult.Text = "Informe o período";
                return passed;
            }
            else
            {
                passed = true; lblResult.Text = "";
            }
            if (txtAno.Text.Equals(""))
            {
                passed = false;
                lblResult.Text = "Informe o ano";
                return passed;
            }
            else
            {
                int _ano = int.Parse(txtAno.Text);
                if ((_ano > 1960) && (_ano <= DateTime.Now.Year))
                {
                    passed = true;
                    lblResult.Text = "";
                }
                else
                {
                    passed = false;
                    lblResult.Text = "Ano inválido";
                    return passed;
                }
            }
            
            
            
            

            return passed;
        }

        private void cadMat_Load(object sender, EventArgs e)
        {
            
            Global gb = new Global();

            if (_modo == Global.Modo.Novo)
            {
                txtCodMateria.Text = gb.getCodigo("select max(idMateria) From Materia");
            }
           
        }

        private void txtAno_KeyPress(object sender, KeyPressEventArgs e)
        {

            if ((!Char.IsNumber(e.KeyChar)) && (e.KeyChar != Convert.ToChar(Keys.Back) && (e.KeyChar != Convert.ToChar(Keys.Delete))))
            {
                e.Handled = true;
                erro.SetError(txtAno, "Digite apenas números");
            }
            else
                erro.Clear();
            
        }

        private void txtPeriod_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((!Char.IsNumber(e.KeyChar)) && (e.KeyChar != Convert.ToChar(Keys.Back) && (e.KeyChar != Convert.ToChar(Keys.Delete))))
            {
                e.Handled = true;
                erro.SetError(txtPeriod, "Digite apenas números");
            }
            else
                erro.Clear();
        }

        private void txtSigla_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if ((!Char.IsLetter(e.KeyChar)) && (e.KeyChar != Convert.ToChar(Keys.Back)) && (!Char.IsNumber(e.KeyChar)))
            if(Char.IsSymbol(e.KeyChar))
            {
                if (!validFolderName(e.KeyChar))
                {
                    e.Handled = true;
                    erro.SetError(txtSigla, "A sigla não pode conter os caracteres \\ / : * ? \" < > e |");
                }
                else
                {
                    erro.Clear();
                }
            }
            else
            {
                erro.Clear();
            }
        }

        /// <summary>
        /// Nome de pasta válido
        /// </summary>
        /// <param name="chars"></param>
        /// <returns></returns>
        private bool validFolderName(char chars) {
            bool valido = false;

            char[] c = { '\\','/',':','*','?','\"','<','>','|'};

            foreach (char ch in c)
            {
                if (ch.Equals(chars))
                {
                    valido = false;
                    break;

                }
            }
            return valido;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            limpaCampos();
        }

        private void limpaCampos()
        {
            foreach (Control c in painel.Controls)
            {
                if ((c is TextBox) && (c.Name != txtCodMateria.Name))
                {
                    c.Text = "";
                }
            }
        }


     }
}
